package rpcserver

import (
	"context"
	"mall/common/xerr"

	"github.com/pkg/errors"
	"github.com/zeromicro/go-zero/core/logx"
	"google.golang.org/grpc"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

/**
* @Description rpc service logger interceptor 日志拦截器
* 当有请求进入到rpc服务时候，先进入拦截器然后就是执行handler方法，如果你想在进入之前处理某些事情就可以写在handler方法之前，
* 那我们想处理的是返回结果如果有错误的情况，所以我们在handler下方使用了github.com/pkg/errors这个包，
* 这个包处理错误是go中经常用到的这不是官方的errors包，但是设计的很好，go官方的Wrap、Wrapf等就是借鉴了这个包的思路。
**/

func LoggerInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {

	resp, err = handler(ctx, req)
	if err != nil {
		causeErr := errors.Cause(err)                // err类型
		if e, ok := causeErr.(*xerr.CodeError); ok { //自定义错误类型
			logx.WithContext(ctx).Errorf("【RPC-SRV-ERR】 %+v", err)

			//转成grpc err
			//e.GetErrCode()就是我们定义的code; e.GetErrMsg() 就是我们之前定义返回的错误第二个参数
			err = status.Error(codes.Code(e.GetErrCode()), e.GetErrMsg())
		} else {
			logx.WithContext(ctx).Errorf("【RPC-SRV-ERR】 %+v", err)
		}

	}

	return resp, err
}
